package com.smart.community.region.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.fasterxml.jackson.annotation.JsonIgnore;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 单元实体类
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sc_unit")
public class Unit implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 单元ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 单元名称
     */
    @TableField("unit_name")
    private String unitName;

    /**
     * 单元编号
     */
    @TableField("unit_no")
    private String unitNo;

    /**
     * 所属社区ID
     */
    @TableField("community_id")
    private Long communityId;

    /**
     * 单元编码
     */
    @TableField("unit_code")
    private String unitCode;

    /**
     * 所属楼栋ID
     */
    @TableField("building_id")
    private Long buildingId;

    /**
     * 楼层数
     */
    @TableField("floor_count")
    private Integer floorCount;

    /**
     * 房间数量
     */
    @TableField("room_count")
    private Integer roomCount;

    /**
     * 房户数量
     */
    @TableField("household_count")
    private Integer householdCount;

    /**
     * 是否有电梯：0-无，1-有
     */
    @TableField("has_elevator")
    private Integer hasElevator;

    /**
     * 电梯数量
     */
    @TableField("elevator_count")
    private Integer elevatorCount;

    /**
     * 门禁类型：1-密码，2-刷卡，3-人脸识别，4-指纹
     */
    @TableField("door_access_type")
    private Integer doorAccessType;

    /**
     * 门禁密码
     */
    @TableField("access_code")
    private String accessCode;

    /**
     * 单元面积(平方米)
     */
    @TableField("area")
    private BigDecimal area;

    /**
     * 单元管理员ID
     */
    @TableField("manager_id")
    private Long managerId;

    /**
     * 配套设施（JSON格式）
     */
    @TableField("facilities")
    private String facilities;

    /**
     * 备注
     */
    @TableField("remark")
    private String remark;

    /**
     * 状态：0-建设中，1-正常使用，2-维修中，3-停用
     */
    @TableField("status")
    private Integer status;

    /**
     * 排序字段
     */
    @TableField("sort_order")
    private Integer sortOrder;

    /**
     * 版本号
     */
    @Version
    @TableField("version")
    private Integer version = 1;

    /**
     * 逻辑删除：0-未删除，1-已删除
     */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;

    /**
     * 创建人ID
     */
    @TableField("create_by")
    private Long createBy;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新人ID
     */
    @TableField("update_by")
    private Long updateBy;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 楼层号
     */
    @TableField("floor_number")
    private Integer floorNumber;

    // ==================== 业务方法 ====================

    /**
     * 获取状态文本
     */
    @JsonIgnore
    public String getStatusDesc() {
        if (status == null) return "未知";
        switch (status) {
            case 0: return "建设中";
            case 1: return "正常使用";
            case 2: return "维修中";
            case 3: return "停用";
            default: return "未知";
        }
    }

    /**
     * 计算平均每层房户数
     */
    @JsonIgnore
    public Integer getAverageHouseholdPerFloor() {
        if (floorCount == null || floorCount == 0) {
            return 0;
        }
        if (householdCount == null) {
            return 0;
        }
        return householdCount / floorCount;
    }

    /**
     * 获取门禁类型文本
     */
    @JsonIgnore
    public String getDoorAccessTypeText() {
        if (doorAccessType == null) return "未知";
        switch (doorAccessType) {
            case 1: return "密码";
            case 2: return "刷卡";
            case 3: return "人脸识别";
            case 4: return "指纹";
            default: return "未知";
        }
    }

    /**
     * 获取电梯状态文本
     */
    @JsonIgnore
    public String getElevatorStatusText() {
        if (hasElevator == null) return "未知";
        return hasElevator == 1 ? "有电梯" : "无电梯";
    }
} 